package dados;

import help.Helper;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;

public class Solucao {
	private ArrayList<Integer> solucao;
	
	private BigDecimal custo;
	
	private HashSet<Integer> pontos;
	
	private Torre torreInvertida;
	
	public Solucao() {
		this.custo = BigDecimal.ZERO;
		this.solucao = new ArrayList<Integer>();
		this.pontos = new HashSet<Integer>();
	}
	
	public Solucao(Instancia instancia, Solucao fonte) {
		this.custo = fonte.getCusto();
		this.pontos = new HashSet<Integer>();
		this.solucao = new ArrayList<Integer>();
		Helper.copiaSolucao(instancia, fonte, this.solucao, this.pontos);
	}
	
	public ArrayList<Integer> getSolucao() {
		return solucao;
	}

	public void setSolucao(ArrayList<Integer> solucao) {
		this.solucao = solucao;
	}

	public BigDecimal getCusto() {
		return custo;
	}

	public void setCusto(BigDecimal custo) {
		this.custo = custo;
	}

	public void setPontos(HashSet<Integer> pontos) {
		this.pontos = pontos;
	}

	public HashSet<Integer> getPontos() {
		return pontos;
	}

	public Integer getQtdPontos() {
		return pontos.size();
	}
	
	public void addTorre(Instancia instancia, Integer torre) {
		this.solucao.add(torre);
		this.custo = this.custo.add(instancia.getTorresLista().get(torre).getCusto());
		this.pontos.addAll(instancia.getTorresLista().get(torre).getPontosCobertos());
	}
	
	public void removeTorre(Instancia instancia, Integer torre) {
		this.solucao.remove(torre);
		this.custo = this.custo.subtract(instancia.getTorresLista().get(torre).getCusto());
		
		this.pontos.clear();
		
		for (int i=0; i<this.solucao.size(); i++) {
			this.pontos.addAll(instancia.getTorresLista().get(this.solucao.get(i)).getPontosCobertos());
		}
	}

	public void setTorreInvertida(Torre torreInvertida) {
		this.torreInvertida = torreInvertida;
	}

	public Torre getTorreInvertida() {
		return torreInvertida;
	}
}
